package br.com.sovi.mobile.resources.ponto;

import java.util.List;

import org.openinsula.vulcano.orm.command.DaoCommand;
import org.openinsula.vulcano.orm.dao.query.DaoQuery;
import org.openinsula.vulcano.orm.dao.query.builder.DaoSelect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.sovi.persistence.Dispositivo;
import br.com.sovi.persistence.Ponto;

public class VerifyInsideCercaCommand extends DaoCommand<Boolean> {
	private static final long serialVersionUID = 1L;

	private final Logger logger = LoggerFactory.getLogger(getClass());

	private final String serial;

	public VerifyInsideCercaCommand(String serial) {
		this.serial = serial;
	}

	@Override
	public Boolean execute() {
		DaoQuery<Dispositivo> query = new DaoSelect<Dispositivo>().all().from(Dispositivo.class).eq("serial", serial)
				.limit(1).toQuery();
		Dispositivo dispositivo = dao.findUnique(query);

		if (dispositivo == null) {
			throw new RuntimeException("Dispositivo não encontrado.");
		}

		if (dispositivo.getCerca() != null && !dispositivo.getCerca().getPontos().isEmpty()) {
			List<Ponto> pontos = dispositivo.getCerca().getPontos();

			Point[] points = new Point[pontos.size()];

			for (int i = 0; i < pontos.size(); i++) {
				Ponto p = pontos.get(i);
				points[i] = new Point(p.getLatitude(), p.getLongitude());
				
				logger.debug("new Point(" + p.getLatitude() + ", " + p.getLongitude() + ");");
			}

			Polygon polygon = new Polygon(points);

			Ponto ponto = dispositivo.getPontos().get(0);

			logger.debug("Ponto sendo analizado como no meio: " + ponto.getLatitude() + " - " + ponto.getLongitude());

			Point pointAnalizado = new Point(ponto.getLatitude(), ponto.getLongitude());

			return polygon.contains(pointAnalizado);
		}
		else {
			throw new RuntimeException("Dispositivo não possuí cerca.");
		}
	}

}
